# 1.给定以下列表, 通过**匿名函数**和**常规函数**根据键`age`来排序

classes = [
      {"name": "abyss", "age": 25, "grade": "A"},
      {"name": "kin", "age": 23, "grade": "B"},
      {"name": "tian", "age": 24, "grade": "B"},
      {"name": "hun", "age": 26, "grade": "A"},
      {"name": "exe", "age": 21, "grade": "A"}
]

# 匿名函数排序


def sort_with_lambda():                                     # 定义匿名函数以age键增序排序
    return sorted(classes, key=lambda d: d['age'])

# 常规函数


def sort_age(d):                                            # 定义函数返回键值
    return d['age']


def sort_for_normal_func():                                 # 定义常规函数以age键,增序排列
    return sorted(classes, key=sort_age, reverse=False)


print('运用匿名函数根据age排序', sort_with_lambda(), sep='\n')       # sep函数将两元素间默认空格替换为换行
print('运用常规函数根据age排序', sort_for_normal_func(), sep='\n')    # sep函数将两元素间默认空格替换为换行


# 2.2021年马上就要到来了, 通过`map`函数将上述同学的`age`+1


def map_age_add(d):                                         # 定义函数年龄加1
    d['age'] += 1
    return d


list_2020 = map(map_age_add, classes)                                             # map(函数，执行序列）
print('使用map函数将上述同学的age+1（创建新列表）', list(list_2020), sep='\n')           # sep函数将两元素间默认空格替换为换行


# 3.通过`filter`函数过滤掉上述同学中`grade`是`A`的同学


grade_no_a = filter(lambda d: d['grade'] != 'A', classes)
list_no_a = list(grade_no_a)                                            # 将过滤后的迭代器对象转换为list
print('过滤成绩为A的同学', list_no_a, sep='\n')


# 4.使用递归来重构斐波那契函数


def recur_fibonacci(n):                                                 # 定义斐波那契函数

    if n <= 1:
        return n
    else:
        return recur_fibonacci(n - 1) + recur_fibonacci(n - 2)                # 递归思想，函数体内调用函数


t = int(input("您要输出几项? "))                                          # 获取用户输入

if t <= 0:                                                             # 检查输入项是否正确
    print("输入正数")
else:
    print("斐波那契数列:")
    for i in range(t):                                                 # for循环实现斐波那契数列
        print(recur_fibonacci(i))
